/**
 * PDF文件处理工具函数
 */

/**
 * 处理PDF文件流响应并下载
 * @param response - PDF文件流响应
 * @param filename - 文件名（可选）
 */
export function downloadPdf(response: any, filename?: string) {
  // 从响应头中获取文件名
  const contentDisposition = response.headers?.['content-disposition'];
  let fileName = filename;
  
  if (contentDisposition) {
    const filenameMatch = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);
    if (filenameMatch && filenameMatch[1]) {
      fileName = filenameMatch[1].replace(/['"]/g, '');
    }
  }
  
  // 如果没有文件名，使用默认名称
  if (!fileName) {
    fileName = `certificate_${Date.now()}.pdf`;
  }
  
  // 确保文件名有.pdf扩展名
  if (!fileName.toLowerCase().endsWith('.pdf')) {
    fileName += '.pdf';
  }
  
  // 创建blob URL
  const blob = new Blob([response.data], { type: 'application/pdf' });
  const url = window.URL.createObjectURL(blob);
  
  // 创建下载链接
  const link = document.createElement('a');
  link.href = url;
  link.download = fileName;
  document.body.appendChild(link);
  link.click();
  
  // 清理
  document.body.removeChild(link);
  window.URL.revokeObjectURL(url);
}

/**
 * 处理PDF文件流响应并在新窗口预览
 * @param response - PDF文件流响应
 */
export function previewPdf(response: any) {
  const blob = new Blob([response.data], { type: 'application/pdf' });
  const url = window.URL.createObjectURL(blob);
  
  // 在新窗口打开PDF
  const newWindow = window.open(url, '_blank');
  
  // 如果新窗口被阻止，则下载文件
  if (!newWindow) {
    downloadPdf(response);
  }
  
  // 延迟清理URL，确保新窗口能正常加载
  setTimeout(() => {
    window.URL.revokeObjectURL(url);
  }, 1000);
}

/**
 * 检查响应是否为PDF文件
 * @param response - 响应对象
 * @returns 是否为PDF文件
 */
export function isPdfResponse(response: any): boolean {
  const contentType = response.headers?.['content-type'] || '';
  return contentType.includes('application/pdf');
}

/**
 * 获取PDF文件大小（字节）
 * @param response - PDF文件流响应
 * @returns 文件大小
 */
export function getPdfFileSize(response: any): number {
  return response.data?.size || 0;
}

/**
 * 格式化文件大小
 * @param bytes - 字节数
 * @returns 格式化的文件大小字符串
 */
export function formatFileSize(bytes: number): string {
  if (bytes === 0) return '0 Bytes';
  
  const k = 1024;
  const sizes = ['Bytes', 'KB', 'MB', 'GB'];
  const i = Math.floor(Math.log(bytes) / Math.log(k));
  
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}
